import json
import httpx
from typing import Any
from mcp.server.fastmcp import FastMCP

# 初始化mcp服务器
mcp=FastMCP("WeatherServer")

#OpenWeather API 配置
OPENWEATHER_API_BASE = "https://api.openweathermap.org/data/2.5/weather"
API_KEY ="055bcd72c5dd30682f75465070ae0f46"
USER_AGENT = "weather-app/1.0"

async def fetch_weather(city: str) -> dict[str, Any]|None:
    """
    获取天气信息
    """
    params={
        "q": city,
        "appid": API_KEY,
        "units": "metric",
        "lang": "zh_cn"
    }
    headers={
        "User-Agent": USER_AGENT
    }
    async with httpx.AsyncClient() as client:
        response = await client.get(OPENWEATHER_API_BASE, params=params, headers=headers,timeout=1000)
        if response.status_code == 200:
            return response.json()
        else:
            print(f"Error fetching weather data: {response.status_code}, {response.text}")  # 增加日志输
            return None

def format_weather(data: dict[str,Any] | str)->str:
    """
    解析天气数据字典，提取关键信息并格式化输出。
    功能：对可能缺失的嵌套数据字段进行容错处理，确保返回内容完整。
    参数：
        data: 天气API返回的原始数据字典
    返回：
        格式化后的天气信息字符串
    """
    # 基础位置信息（城市、国家）- 缺失时显示"未知"
    city = data.get("name", "未知")  # 城市名称（顶层字段）
    country = data.get("sys", {}).get("country", "未知")  # 国家代码（嵌套在sys字段中）

    # 天气核心指标 - 缺失时显示"N/A"（Not Available）
    main_data = data.get("main", {})  # 提取main字段（包含温度、湿度等）
    temperature = main_data.get("temp", "N/A")  # 温度
    humidity = main_data.get("humidity", "N/A")  # 湿度

    wind_data = data.get("wind", {})  # 提取wind字段（包含风速等）
    wind_speed = wind_data.get("speed", "N/A")  # 风速

    # 天气描述 - weather字段可能为空列表，默认返回第一个元素的描述
    weather_list = data.get("weather", [{}])  # 提取weather数组（默认空字典避免索引错误）
    weather_description = weather_list[0].get("description", "未知")  # 天气状况描述

    # 格式化输出字符串（使用f-string拼接，添加emoji直观展示）
    weather_info = (
        f"🌍 {city}, {country}\n"
        f"🌡️ 温度：{temperature}℃\n"
        f"💧 湿度：{humidity}%\n"
        f"💨 风速：{wind_speed} m/s\n"
        f"☁️ 天气：{weather_description}\n"
    )

    return weather_info

@mcp.tool()
async def query_weather(city: str) -> str:
    """
    查询天气信息并返回结果
    """
    weather_data = await fetch_weather(city)
    if weather_data:
        return format_weather(weather_data)
    else:
        return "无法获取天气信息。请检查城市名称是否正确。"

if __name__=="__main__":
    mcp.run(transport='stdio')